package Negocios;

import CDB.PersonFactory;
import CDB.Proveedores;
import java.awt.HeadlessException;
import java.util.List;
import javax.swing.JOptionPane;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;

/**
 *
 * @author lightemp
 */
public class ControlProviders {

    private Session session;
    private Transaction transaction;
    private SessionFactory sessionFactory;

    public ControlProviders() {
    }

    public List selectAll() {
        String sentencia = "from Proveedores p";
        List listProviders;
        try {
            session = null;
            sessionFactory = PersonFactory.getSessionFactory();
            session = sessionFactory.openSession();
            try {
                Query query = session.createQuery(sentencia);
                listProviders = query.list();
                return listProviders;
            } catch (HibernateException e) {
                JOptionPane.showMessageDialog(null, "error: " + e, "Ha ocurrido un error", 0);
                return null;
            }
        } catch (HibernateException | HeadlessException e) {
            JOptionPane.showMessageDialog(null, "error: " + e, "Ha ocurrido un error", 0);
            return null;
        } finally {
            session.flush();
            session.close();
        }
    }

    public Proveedores selectOne(int id) {
        Proveedores prov = null;
        try {
            Session sessions = createSession();
            prov = (Proveedores) sessions.load(Proveedores.class,
                    new Integer(id));
            sessions.close();
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "error: " + e, "Ha ocurrido un error", 0);
        }
        return prov;
    }

    public boolean providerExist(String nombre) {
        boolean res = false;
        try {
            Session session = createSession();
            List list = session.createQuery("from Proveedores p where p.nombre='" + nombre + "'").list();
            if (list.size() > 0) {
                res = true;
            }
            session.close();
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "error: " + e, "Ha ocurrido un error", 0);
        }
        return res;
    }

    public Proveedores selectByName(String nombre) {
        boolean res = false;
        Proveedores pro= new Proveedores();
        try {
            Session session = createSession();
            List list = session.createQuery("from Proveedores p where p.nombre='" + nombre + "'").list();
            pro = (Proveedores) list.get(0);
            if (list.size() > 0) {
                res = true;
            }
            session.close();
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "error: " + e, "Ha ocurrido un error", 0);
        }
        return pro;
    }

    public void add(String nombre, String direccion, String telefono, String email) {
        try {
            iniciaSF();

            //Creando un objeto
            Proveedores provider = new Proveedores();
            provider.setNombre(nombre);
            provider.setDireccion(direccion);
            provider.setTelefono(telefono);
            provider.setEmail(email);

            session.save(provider);
        } catch (HibernateException e) {
            JOptionPane.showMessageDialog(null, "error: " + e, "Ha ocurrido un error", 0);
        } finally {
            cierraSF();
        }

    }

    public void Update(int idProveedor, String nombre, String direccion, String telefono, String email) {
        try {
            iniciaSF();

            //Creando un objeto
            Proveedores provider = (Proveedores) session.load(Proveedores.class,
                    new Integer(idProveedor));

            provider.setNombre(nombre);
            provider.setDireccion(direccion);
            provider.setTelefono(telefono);
            provider.setEmail(email);
            session.update(provider);

        } catch (HibernateException e) {
            JOptionPane.showMessageDialog(null, "error: " + e, "Ha ocurrido un error", 0);
        } finally {
            cierraSF();
        }
    }

    public void delete(int idProveedor) {
        try {
            iniciaSF();

            Proveedores provider = (Proveedores) session.load(Proveedores.class,
                    new Integer(idProveedor));
            session.delete(provider);
        } catch (HibernateException e) {
            JOptionPane.showMessageDialog(null, "error: " + e, "Ha ocurrido un error", 0);
        } finally {
            cierraSF();
        }

    }

    public void iniciaSF() {
        try {
            session = null;
            sessionFactory = PersonFactory.getSessionFactory();
            session = sessionFactory.openSession();
            transaction = session.beginTransaction();
        } catch (HibernateException e) {
            JOptionPane.showMessageDialog(null, "error: " + e + "\n"
                    + "En el controlador de proveedores.", "Error al iniciar Session",
                    0);
        }

    }

    public void cierraSF() {
        try {
            transaction.commit();
            session.flush();
            session.close();
        } catch (HibernateException e) {
            JOptionPane.showMessageDialog(null, "error: " + e + "\n"
                    + "En el controlador de proveedores.", "Error al cerrar Session",
                    0);
        }
    }

    public Session createSession() {

        Session session = null;
        try {
            //creando la nueva session para usar hibernate
            sessionFactory = PersonFactory.getSessionFactory();
            session = sessionFactory.openSession();

        } catch (HibernateException e) {
            JOptionPane.showMessageDialog(null, "error: " + e + "\n"
                    + "En el controlador de proveedores.", "Error al crear Session",
                    0);
            session.close();
        }
        return session;
    }
}
